;读取cmos ram，以"年/月/日 时:分:秒"的形式显示当前的时间
;秒分时 日月年存放单元位置 ：024 789 ，每个占用一个字节
;本程序 先从CMOS RAM 中读出 年月日时分秒，然后存于栈中，再出栈复制到显存在DOS下显示。
assume cs:code,ss:stack
stack segment stack
	db 32 dup(0)
stack ends
code segment
	start:
		mov ax,stack
		mov ss,ax
		mov sp,32
		
		mov ax,0h
		mov cx,3h
		mov al,0h
		mov bl,al
		L2:
		mov al,bl
		out 70h,al
		in al,71h	;此时al中存储着时间
		push ax
		add bl,2h
		loop L2
		
		mov ax,0h
		mov cx,3h
		mov al,7h
		mov bl,al
		L1:
		mov al,bl
		out 70h,al
		in al,71h	;此时al中存储着年月日
		push ax		;把取出的数据暂存到栈中，L1相同
		inc bl
		loop L1
;------------------以上的程序功能是从cmos ram中读出时间相关的数据 ，放入程序栈空间中
		mov cx,3
		mov di,0
		
		L3:
		pop ax		;之前从端口取出的数据，但此时是以二进制（BCD码）形式存储于ax中，要通过显存显示必须转换成ASCII码
		call sub_fun
		mov byte ptr es:[80*12+20*2+di],ah 
		mov byte ptr es:[80*12+20*2+di+2],al
		add di,6
		loop L3
		mov byte ptr es:[80*12+20*2+4],'/'
		mov byte ptr es:[80*12+20*2+10],'/'
		mov byte ptr es:[80*12+20*2+16],' '
		
		mov cx,3
		mov di,18
		L4:
		pop ax		;之前从端口取出的数据，但此时是以二进制（BCD码）形式存储于ax中，要通过显存显示必须转换成ASCII码
		call sub_fun
		mov byte ptr es:[80*12+20*2+di],ah ;
		mov byte ptr es:[80*12+20*2+di+2],al
		add di,6
		loop L4
		mov byte ptr es:[80*12+20*2+22],':'
		mov byte ptr es:[80*12+20*2+28],':'
		
		mov ax,4c00h
		int 21h
		
		sub_fun:	;ax要作为参数传入和传出，es也要传出，所以中间不需要要压栈存储
		push cx
		push bx
		mov ah,al
		mov cl,4
		shr ah,cl
		and al,00001111b
		add ah,30h
		add al,30h
		mov bx,0b800h
		mov es,bx
		pop bx
		pop cx
		ret
code ends
end start